<!DOCTYPE html>
<html>
<head><meta name="generator" content="Hexo 3.8.0">
  <meta charset="utf-8">
  
  <title>docker基础篇 | JAVA</title>
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
  
  <meta name="keywords" content="运维与虚拟化技术">
  
  
  
  
  <meta name="description" content="Docker简介什么是Docker？Docker 是一个开源的应用容器引擎，让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中，然后发布到任何流行的 Linux或Windows 机器上，也可以实现虚拟化。容器是完全使用沙箱机制，相互之间不会有任何接口。 为什么用Docker?作为一种新兴的虚拟化方法，Docker跟传统的虚拟化方式相比具有众多的优势。  更高效的利用系统资源 由于容器不需要进">
<meta name="keywords" content="运维与虚拟化技术">
<meta property="og:type" content="article">
<meta property="og:title" content="docker基础篇">
<meta property="og:url" content="https://jameslin23.gitee.io/2020/12/22/docker基础篇/index.html">
<meta property="og:site_name" content="JAVA">
<meta property="og:description" content="Docker简介什么是Docker？Docker 是一个开源的应用容器引擎，让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中，然后发布到任何流行的 Linux或Windows 机器上，也可以实现虚拟化。容器是完全使用沙箱机制，相互之间不会有任何接口。 为什么用Docker?作为一种新兴的虚拟化方法，Docker跟传统的虚拟化方式相比具有众多的优势。  更高效的利用系统资源 由于容器不需要进">
<meta property="og:locale" content="zh-CN">
<meta property="og:image" content="https://jameslin23.gitee.io/2020/12/22/docker%E5%9F%BA%E7%A1%80%E7%AF%87/image-20201222093759205.png">
<meta property="og:image" content="https://jameslin23.gitee.io/2020/12/22/docker%E5%9F%BA%E7%A1%80%E7%AF%87/image-20201222105019871.png">
<meta property="og:image" content="https://jameslin23.gitee.io/2020/12/22/docker%E5%9F%BA%E7%A1%80%E7%AF%87/image-20201222105056444.png">
<meta property="og:image" content="https://jameslin23.gitee.io/2020/12/22/docker%E5%9F%BA%E7%A1%80%E7%AF%87/image-20201222105550892.png">
<meta property="og:image" content="https://jameslin23.gitee.io/2020/12/22/docker%E5%9F%BA%E7%A1%80%E7%AF%87/image-20201222111042648.png">
<meta property="og:image" content="https://jameslin23.gitee.io/2020/12/22/docker%E5%9F%BA%E7%A1%80%E7%AF%87/image-20201222175017542.png">
<meta property="og:image" content="https://jameslin23.gitee.io/2020/12/22/docker%E5%9F%BA%E7%A1%80%E7%AF%87/image-20201223092909412.png">
<meta property="og:image" content="https://jameslin23.gitee.io/2020/12/22/docker%E5%9F%BA%E7%A1%80%E7%AF%87/image-20201223093913511.png">
<meta property="og:image" content="https://jameslin23.gitee.io/2020/12/22/docker%E5%9F%BA%E7%A1%80%E7%AF%87/image-20201223094523624.png">
<meta property="og:image" content="https://jameslin23.gitee.io/2020/12/22/docker%E5%9F%BA%E7%A1%80%E7%AF%87/image-20201223095659128.png">
<meta property="og:image" content="https://jameslin23.gitee.io/2020/12/22/docker%E5%9F%BA%E7%A1%80%E7%AF%87/image-20201223103642080.png">
<meta property="og:updated_time" content="2020-12-23T08:32:49.068Z">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="docker基础篇">
<meta name="twitter:description" content="Docker简介什么是Docker？Docker 是一个开源的应用容器引擎，让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中，然后发布到任何流行的 Linux或Windows 机器上，也可以实现虚拟化。容器是完全使用沙箱机制，相互之间不会有任何接口。 为什么用Docker?作为一种新兴的虚拟化方法，Docker跟传统的虚拟化方式相比具有众多的优势。  更高效的利用系统资源 由于容器不需要进">
<meta name="twitter:image" content="https://jameslin23.gitee.io/2020/12/22/docker%E5%9F%BA%E7%A1%80%E7%AF%87/image-20201222093759205.png">
  
    <link rel="alternate" href="/atom.xml" title="JAVA" type="application/atom+xml">
  

  

  <link rel="icon" href="/css/images/mylogo.jpg">
  <link rel="apple-touch-icon" href="/css/images/mylogo.jpg">
  
    <link href="//fonts.googleapis.com/css?family=Source+Code+Pro" rel="stylesheet" type="text/css">
  
  <link href="https://fonts.googleapis.com/css?family=Open+Sans|Montserrat:700" rel="stylesheet" type="text/css">
  <link href="https://fonts.googleapis.com/css?family=Roboto:400,300,300italic,400italic" rel="stylesheet" type="text/css">
  <link href="//netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.css" rel="stylesheet">
  <style type="text/css">
    @font-face{font-family:futura-pt; src:url("/css/fonts/FuturaPTBold.otf") format("woff");font-weight:500;font-style:normal;}
    @font-face{font-family:futura-pt-light; src:url("/css/fonts/FuturaPTBook.otf") format("woff");font-weight:lighter;font-style:normal;}
    @font-face{font-family:futura-pt-italic; src:url("/css/fonts/FuturaPTBookOblique.otf") format("woff");font-weight:400;font-style:italic;}
}

  </style>
  <link rel="stylesheet" href="/css/style.css">

  <script src="/js/jquery-3.1.1.min.js"></script>
  <script src="/js/bootstrap.js"></script>

  <!-- Bootstrap core CSS -->
  <link rel="stylesheet" href="/css/bootstrap.css">

  
    <link rel="stylesheet" href="/css/dialog.css">
  

  

  
    <link rel="stylesheet" href="/css/header-post.css">
  

  
  
  
    <link rel="stylesheet" href="/css/vdonate.css">
  

</head>
</html>


  <body data-spy="scroll" data-target="#toc" data-offset="50">


  
  <div id="container">
    <div id="wrap">
      
        <header>

    <div id="allheader" class="navbar navbar-default navbar-static-top" role="navigation">
        <div class="navbar-inner">
          
          <div class="container"> 
            <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
              <span class="sr-only">Toggle navigation</span>
              <span class="icon-bar"></span>
              <span class="icon-bar"></span>
              <span class="icon-bar"></span>
            </button>

            
              <a class="brand" style="border-width: 0;">
                <p>JAVA</p>
              </a>
            
            
            <div class="navbar-collapse collapse">
              <ul class="hnav navbar-nav">
                
                  <li> <a class="main-nav-link" href="/">首页</a> </li>
                
                  <li> <a class="main-nav-link" href="/archives">归档</a> </li>
                
                  <li> <a class="main-nav-link" href="/categories">分类</a> </li>
                
                  <li> <a class="main-nav-link" href="/tags">标签</a> </li>
                
                  <li> <a class="main-nav-link" href="/about">关于</a> </li>
                
                  <li><div id="search-form-wrap">

    <form class="search-form">
        <input type="text" class="ins-search-input search-form-input" placeholder>
        <button type="submit" class="search-form-submit"></button>
    </form>
    <div class="ins-search">
    <div class="ins-search-mask"></div>
    <div class="ins-search-container">
        <div class="ins-input-wrapper">
            <input type="text" class="ins-search-input" placeholder="请输入关键词...">
            <span class="ins-close ins-selectable"><i class="fa fa-times-circle"></i></span>
        </div>
        <div class="ins-section-wrapper">
            <div class="ins-section-container"></div>
        </div>
    </div>
</div>
<script>
(function (window) {
    var INSIGHT_CONFIG = {
        TRANSLATION: {
            POSTS: '文章',
            PAGES: '页面',
            CATEGORIES: '分类',
            TAGS: '标签',
            UNTITLED: '(无标题)',
        },
        ROOT_URL: '/',
        CONTENT_URL: '/content.json',
    };
    window.INSIGHT_CONFIG = INSIGHT_CONFIG;
})(window);
</script>
<script src="/js/insight.js"></script>

</div></li>
            </ul></div>
          </div>
                
      </div>
    </div>

</header>



      
            
      <div id="content" class="outer">
        
          <section id="main" style="float:none;"><article id="post-docker基础篇" style="width: 75%; float:left;" class="article article-type-post" itemscope itemprop="blogPost">
  <div id="articleInner" class="article-inner">
    
    
      <header class="article-header">
        
  
    <h1 class="thumb" itemprop="name">
      docker基础篇
    </h1>
  

      </header>
    
    <div class="article-meta">
      
	<a href="/2020/12/22/docker基础篇/" class="article-date">
	  <time datetime="2020-12-22T01:13:29.000Z" itemprop="datePublished">2020-12-22</time>
	</a>

      
    <a class="article-category-link" href="/categories/docker/">docker</a>

      
	<a class="article-views">
	<span id="busuanzi_container_page_pv">
		阅读量<span id="busuanzi_value_page_pv"></span>
	</span>
	</a>

      

    </div>
    <div class="article-entry" itemprop="articleBody">
      
        <h2 id="Docker简介"><a href="#Docker简介" class="headerlink" title="Docker简介"></a>Docker简介</h2><h3 id="什么是Docker？"><a href="#什么是Docker？" class="headerlink" title="什么是Docker？"></a>什么是Docker？</h3><p>Docker 是一个开源的应用容器引擎，让开发者可以打包他们的应用以及依赖包到一个可移植的<a href="https://baike.baidu.com/item/镜像/1574" target="_blank" rel="noopener">镜像</a>中，然后发布到任何流行的 <a href="https://baike.baidu.com/item/Linux" target="_blank" rel="noopener">Linux</a>或<a href="https://baike.baidu.com/item/Windows/165458" target="_blank" rel="noopener">Windows</a> 机器上，也可以实现<a href="https://baike.baidu.com/item/虚拟化/547949" target="_blank" rel="noopener">虚拟化</a>。容器是完全使用<a href="https://baike.baidu.com/item/沙箱/393318" target="_blank" rel="noopener">沙箱</a>机制，相互之间不会有任何接口。</p>
<h3 id="为什么用Docker"><a href="#为什么用Docker" class="headerlink" title="为什么用Docker?"></a>为什么用Docker?</h3><p>作为一种新兴的虚拟化方法，Docker跟传统的虚拟化方式相比具有众多的优势。</p>
<ul>
<li><p><strong>更高效的利用系统资源</strong></p>
<p>由于容器不需要进行硬件虚拟以及运行完整操作系统等额外开销，Docker 对系统资源的利用率更高。无论是应用执行速度、内存损耗或者文件存储速度，都要比传统虚拟机技术更效。因此，相比虚拟机技术，一个相同配置的主机，往往可以运行更多数量的应用。</p>
</li>
<li><p><strong>更快速的启动时间</strong></p>
<p>传统的虚拟机技术启动应用服务往往需要数分钟，而 Docker 容器应用，由于直接运行于宿主内核，无需启动完整的操作系统，因此可以做到秒级、甚至毫秒级的启动时间。大大的节约了开发、测试、部署的时间。</p>
</li>
<li><p><strong>一致的运行环境</strong></p>
<p>开发过程中一个常见的问题是环境一致性问题。由于开发环境、测试环境、生产环境不一致，导致有些 bug 并未在开发过程中被发现。而 Docker 的镜像提供了除内核外完整的运行时环境，确保了应用运行环境一致性，从而不会再出现 「这段代码在我机器上没问题啊」 这类问题。</p>
</li>
<li><p><strong>持续交付和部署</strong></p>
<p>对于开发和运维(DevOps)人员来说,最希望的就是一次创建或者配置，可以在任意地方正常运行。使用Docker可以通过定制应用镜像来实现持续继承、持续交付、部署。开发人员可以通过Dockerfile进行镜像构建，并结合持续集成系统进行集成测试。而运维人员可以直接在生产中快速部署该镜像，甚至结合持续部署系统进行自动部署。而使用<code>而使用Dockerfile</code>使镜像构建透明化，不仅仅开发团队可以理解应用运行环境，也方便运维团队理解应用运行所需条件，帮助更好的生产环境中部署该镜像。</p>
</li>
<li><p><strong>更轻松的迁移</strong></p>
<p>由于Docker确保了执行环境的一致性，使得应用的迁移更加容易。Docker可以在很多平台上运行，无论是物理机、虚拟机、公有云、私有云，甚至是笔记本，其运行结构是一致的。</p>
</li>
<li><p><strong>更轻松的维护和扩展</strong></p>
<p>Docker 使用的分层存储以及镜像的技术，使得应用重复部分的复用更为容易，也使得应用的维护更新更加简单，基于基础镜像进一步扩展镜像也变得非常简单。此外，Docker 团队同各个开源项目团队一起维护了一大批高质量的 官方镜像，既可以直接在生产环境使用，又可以作为基础进一步定制，大大的降低了应用服务的镜像制作成本。</p>
<p><img src="https://jameslin23.gitee.io/2020/12/22/docker%E5%9F%BA%E7%A1%80%E7%AF%87/image-20201222093759205.png" alt="image-20201222093759205"></p>
</li>
</ul>
<h2 id="基本概念"><a href="#基本概念" class="headerlink" title="基本概念"></a>基本概念</h2><p>docker包括三个基本概念</p>
<ul>
<li><strong>镜像（Image）</strong></li>
<li><strong>容器（Container）</strong></li>
<li><strong>仓库（Repository）</strong></li>
</ul>
<h3 id="Docker-镜像"><a href="#Docker-镜像" class="headerlink" title="Docker 镜像"></a>Docker 镜像</h3><p>我们都知道,操作系统分为内核和用户空间。对于Linux而言,内核启动后，会挂在<code>root</code>文件系统为其提供用户空间支持。而Docker镜像，就相当于一个<code>root</code>文件系统。比如官方镜像ubuntu:16.04就包含了完整的一套ubuntu16.04最小系统的<code>root</code>文件系统。Docker镜像是一个特殊文件系统，除了提供容器运行时所需的程序、库、资源、配置等文件外、还包含了一些为运行时准备的一些参数(如匿名卷、环境变量、用户等)。<strong>镜像不包含任何动态数据。其内容在构建之后也不会被改变。</strong></p>
<p><strong>分层存储</strong></p>
<p>因为镜像包含操作系统完整的  root  文件系统，其体积往往是庞大的，因此在 Docker 设计时，就充分利用 Union FS 的技术，将其设计为分层存储的架构。所以严格来说，镜像并非是像一个 ISO 那样的打包文件，镜像只是一个虚拟的概念，其实际体现并非由一个文件组成，而是<strong>由一组文件系统组成</strong>，或者说，<strong>由多层文件系统联合组成。镜像构建时，会一层层构建，前一层是后一层的基础。每一层构建完就不会再发生改变，后一层上的任何改变只发生在自己这一层</strong>。比如，删除前一层文件的操作，实际不是真的删除前一层的文件，而是仅在当前层标记为该文件已删除。在最终容器运行的时候，虽然不会看到这个文件，但是实际上该文件会一直跟随镜像。因此，<strong>在构建镜像的时候，需要额外小心，每一层尽量只包含该层需要添加的东西，任何额外的东西应该在该层构建结束前清理掉</strong>。分层存储的特征还使得镜像的复用、定制变的更为容易。甚至可以用之前构建好的镜像作为基础层，然后进一步添加新的层，以定制自己所需的内容，构建新的镜像。</p>
<h3 id="Docker-容器"><a href="#Docker-容器" class="headerlink" title="Docker 容器"></a>Docker 容器</h3><p>镜像和容器的关系，就像是面向对象程序设计中类和实例一样，镜像是静态的定义，容器是镜像运行时的实体。容器可以被创建、启动、删除、暂停等。</p>
<p>容器实质是进程，但与直接在宿主执行的进程不同，容器进程运行属于自己的独立的命名空间。因此容器可以拥有自己<code>root</code>文件系统、自己的网络配置、自己进程空间，甚至自己的用户ID空间。容器内的进程是在运行一个隔离的环境中，使用起来好像是在一个独立于宿主的系统下的操作系统一样。这种特性使得容器封装的应用比直接在宿主运行更加安全。</p>
<p>前面讲过镜像使用的是分层存储，容器也是如此。每一个容器运行时，是以镜像为基础层，在其上创建一个当前容器的存储层，我们可以称这个为容器运行时读写而准备的存储层为容器存储层。<strong>容器存储层的生存周期和容器一样，容器消亡时，容器存储层也随之消亡。因此，任何保存于容器存储层的信息都会随容器删除而丢失。</strong></p>
<p>按照 Docker 最佳实践的要求，容器不应该向其存储层内写入任何数据，容器存储层要保持无状态化。所有的文件写入操作，都应该使用 <strong>数据卷（Volume）</strong>、<strong>或者绑定宿主目录</strong>，在这些位置的读写会跳过容器存储层，直接对宿主（或网络存储）发生读写，其性能和稳定性更高。</p>
<p>数据卷的生存周期独立于容器，容器消亡，数据卷不会消亡。因此，使用数据卷后，容器删除或者重新运行之后，数据却不会丢失。</p>
<h3 id="Docker-仓库"><a href="#Docker-仓库" class="headerlink" title="Docker 仓库"></a>Docker 仓库</h3><p>镜像构建完成后，可以很容易的在当前宿主机上运行，但是，如果需要在其它服务器上使用这个镜像，我们就需要一个集中的存储、分发镜像的服务，Docker Registry 就是这样的服务。一个 Docker Registry 中可以包含多个仓库（ Repository  ）；每个仓库可以包含多个标签（ Tag  ）；每个标签对应一个镜像。</p>
<p>通常，一个仓库会包含同一个软件不同版本的镜像，而标签就常用于对应该软件的各个版本。我们可以通过  &lt;仓库名&gt;:&lt;标签&gt;  的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签，将以  latest  作为默认标签。</p>
<p>最常使用的 Registry 公开服务是官方的 <strong>Docker Hub</strong>，这也是默认的 Registry，并拥有大量的<br>高质量的官方镜像。国内也有一些云服务商提供类似于 Docker Hub 的公开服务。比如 时速云镜像仓库、网易云<br>镜像服务、DaoCloud 镜像市场、阿里云镜像库 等。</p>
<h2 id="安装Docker"><a href="#安装Docker" class="headerlink" title="安装Docker"></a>安装Docker</h2><p>操作系统选择CentOS 7.0以上</p>
<p>安装之前如果需要卸载的话，执行以下指令</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">yum remove docker \</span><br><span class="line">                  docker-client \</span><br><span class="line">                  docker-client-latest \</span><br><span class="line">                  docker-common \</span><br><span class="line">                  docker-latest \</span><br><span class="line">                  docker-latest-logrotate \</span><br><span class="line">                  docker-logrotate \</span><br><span class="line">                  docker-engine</span><br></pre></td></tr></table></figure>

<ol>
<li><p>按照Docker所需要的依赖</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">yum install -y yum-utils \ device-mapper-persistent-data \ lvm2</span><br></pre></td></tr></table></figure>



</li>
</ol>
<ol start="2">
<li><p>设置阿里云镜像库</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">yum-config-manager  --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo</span><br></pre></td></tr></table></figure>
</li>
<li><p>安装Docker</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">yum -y install docker-ce <span class="comment"># ce 为社区版本免费，docker-ee 企业版本</span></span><br></pre></td></tr></table></figure>
</li>
<li><p>设置镜像库加速</p>
<p><img src="https://jameslin23.gitee.io/2020/12/22/docker%E5%9F%BA%E7%A1%80%E7%AF%87/image-20201222105019871.png" alt="image-20201222105019871"></p>
<p><img src="https://jameslin23.gitee.io/2020/12/22/docker%E5%9F%BA%E7%A1%80%E7%AF%87/image-20201222105056444.png" alt="image-20201222105056444"></p>
<p>安装步骤设置即可</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">sudo mkdir -p /etc/docker</span><br><span class="line">sudo tee /etc/docker/daemon.json &lt;&lt;-<span class="string">'EOF'</span></span><br><span class="line">&#123;</span><br><span class="line">  <span class="string">"registry-mirrors"</span>: [<span class="string">"https://qhyb8ixp.mirror.aliyuncs.com"</span>]</span><br><span class="line">&#125;</span><br><span class="line">EOF</span><br><span class="line">sudo systemctl daemon-reload</span><br><span class="line">sudo systemctl restart docker</span><br></pre></td></tr></table></figure>



</li>
</ol>
<ol start="5">
<li><p>开启Docker</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">service docker start</span><br></pre></td></tr></table></figure>
</li>
<li><p>测试</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker run hello-world</span><br></pre></td></tr></table></figure>

<p><img src="https://jameslin23.gitee.io/2020/12/22/docker%E5%9F%BA%E7%A1%80%E7%AF%87/image-20201222105550892.png" alt="image-20201222105550892"></p>
</li>
</ol>
<h2 id="使用镜像"><a href="#使用镜像" class="headerlink" title="使用镜像"></a>使用镜像</h2><p>Docker运行容器前需要本地存在对应的镜像，如果本地不在该镜像,Docker会从镜像仓库下载该镜像。</p>
<ul>
<li>从仓库获取镜像</li>
<li>管理本地主机上的镜像</li>
<li>镜像实现的基本原理</li>
</ul>
<h3 id="获取镜像"><a href="#获取镜像" class="headerlink" title="获取镜像"></a>获取镜像</h3><p>从 Docker 镜像仓库获取镜像的命令是  <code>docker pull</code>  。其命令格式为：</p>
<blockquote>
<p>docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]</p>
</blockquote>
<p>具体的选项可以通过  docker pull –help  命令看到，这里我们说一下镜像名称的格式。</p>
<ul>
<li>Docker 镜像仓库地址：地址的格式一般是  &lt;域名/IP&gt;[:端口号]  。默认地址是 Docker<br>Hub。</li>
<li>仓库名：如之前所说，这里的仓库名是两段式名称，即  &lt;用户名&gt;/&lt;软件名&gt;  。对于 Docker<br>Hub，如果不给出用户名，则默认为  library  ，也就是官方镜像。</li>
</ul>
<p><code>docker pull centos</code></p>
<p><img src="https://jameslin23.gitee.io/2020/12/22/docker%E5%9F%BA%E7%A1%80%E7%AF%87/image-20201222111042648.png" alt="image-20201222111042648"></p>
<h3 id="列出容器"><a href="#列出容器" class="headerlink" title="列出容器"></a>列出容器</h3><p><code>docker image ls</code></p>
<blockquote>
<p>REPOSITORY            TAG                    IMAGE ID                CREATED              SIZE<br>centos                      latest              300e315adb2f          2 weeks ago        209MB<br>hello-world            latest               bf756fb1ae65           11 months ago    13.3kB</p>
</blockquote>
<p>列表包含了  仓库名  、 标签  、 镜像 ID  、 创建时间  以及  所占用的空间  。</p>
<p>可以通过<code>docker system df</code>来便捷的查看镜像、容器、数据卷所占用的空间</p>
<blockquote>
<p>TYPE                   TOTAL     ACTIVE    SIZE      RECLAIMABLE<br>Images                 2               1         209.4MB    209.3MB (99%)<br>Containers          2               0               0B             0B<br>Local Volumes   0                0               0B             0B<br>Build Cache        0                0               0B             0B</p>
</blockquote>
<h3 id="删除镜像"><a href="#删除镜像" class="headerlink" title="删除镜像"></a>删除镜像</h3><p>如果要删除本地的镜像，可以使用  <code>docker image rm</code>  命令，其格式为：</p>
<blockquote>
<p>docker image rm [选项] &lt;镜像1&gt; [&lt;镜像2&gt; …]</p>
</blockquote>
<h3 id="Commit命令"><a href="#Commit命令" class="headerlink" title="Commit命令"></a>Commit命令</h3><p>docker commit命令除了学习外，还有一些特殊的应用场景，比如被入侵后保存现场等，但不要使用该命令指定镜像，指定镜像应该使用<strong>Dockerfile</strong> 完成</p>
<blockquote>
<p>使用  docker commit  意味着所有对镜像的操作都是黑箱操作，生成的镜像也被称为黑箱镜像，换句话说，就是除了制作镜像的人知道执行过什么命令、怎么生成的镜像，别人根本无从得知。而且，即使是这个制作镜像的人，过一段时间后也无法记清具体在操作的。虽然  docker diff  或许可以告诉得到一些线索，但是远远不到可以确保生成一致镜像的地步。这种黑箱镜像的维护工作是非常痛苦的。而且，回顾之前提及的镜像所使用的分层存储的概念，除当前层外，之前的每一层都是不会发生改变的，换句话说，任何修改的结果仅仅是在当前层进行标记、添加、修改，而不会改动上一层。如果使用  docker commit  制作镜像，以及后期修改的话，每一次修改都会让镜像更加臃肿一次，所删除的上一层的东西并不会丢失，会一直如影随形的跟着这个镜像，即使根本无法访问到。这会让镜像更加臃肿。</p>
</blockquote>
<h3 id="DockerFile定制镜像"><a href="#DockerFile定制镜像" class="headerlink" title="DockerFile定制镜像"></a>DockerFile定制镜像</h3><p>DcokerFile是一个文本文件，其中包含了一条条的指令，每一条指令构建一层，因此每一条指令的你内容，就是描述该层应当如何构建。</p>
<p>DockerFile构建指令</p>
<blockquote>
<p>FROM                         # 基础镜像，一切从这里开始构建</p>
<p>MAINTAINER             # 镜像是谁写的， 姓名+邮箱</p>
<p>RUN                           # 镜像构建的时候需要运行的命令</p>
<p>ADD                           # 步骤，tomcat镜像，这个tomcat压缩包！添加内容 添加同目录</p>
<p>WORKDIR                  # 镜像的工作目录</p>
<p>VOLUME                   # 挂载的目录</p>
<p>EXPOSE                     # 保留端口配置</p>
<p>CMD                          # 指定这个容器启动的时候要运行的命令，只有最后一个会生效，可被替代</p>
<p>ENTRYPOINT            # 指定这个容器启动的时候要运行的命令，可以追加命令</p>
<p>COPY                        # 类似ADD，将我们文件拷贝到镜像中</p>
<p>ENV                          # 构建的时候设置环境变量！</p>
</blockquote>
<h4 id="定制centos镜像"><a href="#定制centos镜像" class="headerlink" title="定制centos镜像"></a>定制centos镜像</h4><ol>
<li><p>编写Dockerfile(文件名不是Dockerfile，构建是需要-f指定文件名)</p>
<figure class="highlight dockerfile"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">FROM</span> centos</span><br><span class="line"><span class="keyword">MAINTAINER</span> MT&lt;<span class="number">1172952007</span>@qq.com&gt;</span><br><span class="line"></span><br><span class="line"><span class="keyword">ENV</span> MYPATH /usr/local</span><br><span class="line"><span class="keyword">WORKDIR</span><span class="bash"> <span class="variable">$MYPATH</span></span></span><br><span class="line"></span><br><span class="line"><span class="keyword">RUN</span><span class="bash"> yum -y install vim</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">EXPOSE</span> <span class="number">80</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">CMD</span><span class="bash"> /bin/bash</span></span><br></pre></td></tr></table></figure>
</li>
<li><p>构建mycentos镜像</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker build -f mycentos -t mycentosdemodo:1.0  .</span><br></pre></td></tr></table></figure>
</li>
<li><p>查看镜像历史</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker <span class="built_in">history</span> 镜像ID</span><br></pre></td></tr></table></figure>

</li>
</ol>
<h4 id="定制tomcat镜像"><a href="#定制tomcat镜像" class="headerlink" title="定制tomcat镜像"></a>定制tomcat镜像</h4><ol>
<li><p>编写Dockerfile(文件名不是Dockerfile，构建是需要-f指定文件名)</p>
<figure class="highlight dockerfile"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">FROM</span> centos</span><br><span class="line"><span class="keyword">MAINTAINER</span> fortuneteller&lt;<span class="number">1172952007</span>@qq.com&gt;</span><br><span class="line"></span><br><span class="line"><span class="keyword">COPY</span><span class="bash"> README.txt /usr/<span class="built_in">local</span>/README.txt</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">ADD</span><span class="bash"> jdk-8u271-linux-x64.tar.gz /usr/<span class="built_in">local</span></span></span><br><span class="line"><span class="keyword">ADD</span><span class="bash"> apache-tomcat-9.0.41.tar.gz /usr/<span class="built_in">local</span></span></span><br><span class="line"></span><br><span class="line"><span class="keyword">RUN</span><span class="bash"> yum -y install vim</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">ENV</span> MYPATH /usr/local</span><br><span class="line"><span class="keyword">WORKDIR</span><span class="bash"> <span class="variable">$MYPATH</span></span></span><br><span class="line"></span><br><span class="line"><span class="keyword">ENV</span> JAVA_HOME /usr/local/jdk1.<span class="number">8.0</span>_271</span><br><span class="line"><span class="keyword">ENV</span> CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar</span><br><span class="line"><span class="keyword">ENV</span> CATALINA_HOME /usr/local/apache-tomcat-<span class="number">9.0</span>.<span class="number">41</span></span><br><span class="line"><span class="keyword">ENV</span> CATALINA_BASH /usr/local/apache-toacat-<span class="number">9.0</span>.<span class="number">41</span></span><br><span class="line"><span class="keyword">ENV</span> PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin</span><br><span class="line"></span><br><span class="line"><span class="keyword">EXPOSE</span> <span class="number">8080</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">CMD</span><span class="bash"> [<span class="string">"/usr/local/apache-tomcat-9.0.41/bin/catalina.sh"</span>, <span class="string">"run"</span>]</span></span><br></pre></td></tr></table></figure>
</li>
<li><p>构建mytomcat镜像</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker build  -f Dockerfile-tomcat -t mytomcat .</span><br></pre></td></tr></table></figure>
</li>
<li><p>启动tomcat</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker run -d -p 3344:8080 --name mttomcat -v /data/docker-test/tomcat/<span class="built_in">test</span>:/usr/<span class="built_in">local</span>/apache-tomcat-9.0.41/webapps/<span class="built_in">test</span> -v /data/docker-test/tomcat/<span class="built_in">test</span>/logs:/usr/<span class="built_in">local</span>/apache-tomcat-9.0.41/logs mytomcat</span><br></pre></td></tr></table></figure>

<p><img src="https://jameslin23.gitee.io/2020/12/22/docker%E5%9F%BA%E7%A1%80%E7%AF%87/image-20201222175017542.png" alt="image-20201222175017542"></p>
</li>
<li><p>进入容器</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#查看容器id</span></span><br><span class="line">docker container ls</span><br><span class="line"><span class="comment"># 进入容器</span></span><br><span class="line">docker <span class="built_in">exec</span> -it 容器ID /bin/bash</span><br></pre></td></tr></table></figure>

</li>
</ol>
<h2 id="Docker-容器-1"><a href="#Docker-容器-1" class="headerlink" title="Docker 容器"></a>Docker 容器</h2><h3 id="启动容器"><a href="#启动容器" class="headerlink" title="启动容器"></a>启动容器</h3><p>启动容器有两种方式，一种是基于镜像新建一个容器并启动,另外一个是将在终止状态（stopped）的容器重启启动</p>
<p>因为docker的容器实在太轻量级了，很多时候用户都是随时删除和新创建容器</p>
<ul>
<li><p>新建容器并启动  <code>docker run</code></p>
<blockquote>
<p> docker run -t -i mycentos:1.0 /bin/bash</p>
</blockquote>
</li>
<li><p>存在容器启动 <code>docker container start</code></p>
</li>
</ul>
<p><strong>参数说明</strong></p>
<ul>
<li>-t让docker分配一个伪终端并绑定到容器的标准输入上</li>
<li>-i 则让容器的标志输入保持打开</li>
</ul>
<p>当利用<code>docker run</code> 来创建容器时，Docker在后台运行标准操作包括：</p>
<ul>
<li>检查本地是否存在指定的镜像，不存在就从公有仓库下载</li>
<li>利用镜像创建并启动一个容器</li>
<li>分配一个文件系统，并在只读的镜像层外面挂载一层可读写层</li>
<li>从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中</li>
<li>从地址池配置一个ip地址给容器</li>
<li>执行用户指定的应用程序</li>
<li>执行完毕后容器被终止</li>
</ul>
<h3 id="终止容器"><a href="#终止容器" class="headerlink" title="终止容器"></a>终止容器</h3><p><code>docker container stop</code></p>
<p>查看容器状态</p>
<p><code>docker container ls -a</code></p>
<h3 id="进入容器"><a href="#进入容器" class="headerlink" title="进入容器"></a>进入容器</h3><p>在使用  -d  参数时，容器启动后会进入后台。<br>某些时候需要进入容器进行操作，包括使用  <code>docker attach</code>  命令或  <code>docker exec</code>  命令，推荐大家使用  <code>docker exec</code>  命令</p>
<p>更多参数说明请使用  docker exec –help  查看。</p>
<h3 id="删除容器"><a href="#删除容器" class="headerlink" title="删除容器"></a>删除容器</h3><p>可以使用  <code>docker container rm</code>  来删除一个处于终止状态的容器。例如</p>
<p><code>docker container prune</code>可以清理掉所有处于终止状态的容器。</p>
<h2 id="Docker仓库"><a href="#Docker仓库" class="headerlink" title="Docker仓库"></a>Docker仓库</h2><p>目前 Docker 官方维护了一个公共仓库 Docker Hub，其中已经包括了数量超过 15,000 的镜<br>像。大部分需求都可以通过在 Docker Hub 中直接下载镜像来实现。</p>
<h3 id="注册"><a href="#注册" class="headerlink" title="注册"></a>注册</h3><p>你可以在 <a href="https://cloud.docker.com" target="_blank" rel="noopener">https://cloud.docker.com</a> 免费注册一个 Docker 账号。</p>
<h3 id="登录"><a href="#登录" class="headerlink" title="登录"></a>登录</h3><p>可以通过执行  <code>docker login</code>  命令交互式的输入用户名及密码来完成在命令行界面登录<br>Docker Hub。<br>你可以通过  <code>docker logout</code>  退出登录。</p>
<h3 id="拉取镜像"><a href="#拉取镜像" class="headerlink" title="拉取镜像"></a>拉取镜像</h3><p>你可以通过  <code>docker search</code>  命令来查找官方仓库中的镜像，并利用  <strong>docker pull</strong>  命令来将它<br>下载到本地。</p>
<h3 id="推送镜像"><a href="#推送镜像" class="headerlink" title="推送镜像"></a>推送镜像</h3><p>用户也可以在登录后通过  <strong>docker push</strong>  命令来将自己的镜像推送到 Docker Hub。</p>
<blockquote>
<p>docker push username/ubuntu:17.10</p>
</blockquote>
<h2 id="Docker数据管理"><a href="#Docker数据管理" class="headerlink" title="Docker数据管理"></a>Docker数据管理</h2><p>Docker 内部以及容器之间管理数据，在容器中管理数据主要有两种方式</p>
<ul>
<li><strong>数据卷(Volumes)</strong></li>
<li><strong>挂载主机目录（Bind mounts）</strong></li>
</ul>
<p>容器之间可以有一个数据共享的技术！Docker容器中产生的数据，同步到本地！</p>
<p>这就是卷技术！目录的挂载，将我们容器内的目录，挂载到Linux上面！</p>
<h3 id="使用命令"><a href="#使用命令" class="headerlink" title="使用命令"></a>使用命令</h3><blockquote>
<p>docker run -it -v 主机目录:容器内目录 /bin/bash</p>
</blockquote>
<h3 id="挂载方式"><a href="#挂载方式" class="headerlink" title="挂载方式"></a>挂载方式</h3><blockquote>
<p>-v 容器内路径                      # 匿名挂载</p>
<p>-v 卷名:容器内路径             # 具名挂载 </p>
<p>-v 宿主机路径:容器内路径  # 指定路径挂载</p>
</blockquote>
<p>Docker容器内的卷、在没有指定目录情况下都在<code>/var/lib/docker/volumes/xxx/_data</code>下</p>
<h3 id="扩展"><a href="#扩展" class="headerlink" title="扩展"></a>扩展</h3><blockquote>
<p># 通过 -v 容器内路径：ro rw 改变读写权限</p>
<p>ro # readonly 只读</p>
<p>rw # readwrite 可读可写</p>
<p>docker run -d nginx01 -v nginxdemo:/etc/nginx:ro nginx</p>
</blockquote>
<h2 id="网络配置"><a href="#网络配置" class="headerlink" title="网络配置"></a>网络配置</h2><h3 id="实现原理"><a href="#实现原理" class="headerlink" title="实现原理"></a>实现原理</h3><p>Docker使用linux桥接，在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址，称为Container-IP,同时<strong>Docker网桥是每个容器默认网关</strong>。因为在同一个宿主机的容器都接入同一个网桥，<strong>这样容器之间就能够通过容器的Container直接通讯。</strong></p>
<p>Docker网桥是宿主机虚拟出来的，并不是真实存在的网络设备，外部网络是无法寻址到的，这意味着外部网络无法通过直接Container-IP访问到容器，可以通过映射容器到宿主机(端口映射)，即docker run创建容器时候通过 -p 或 -P 参数来启用，访问容器的时候就通过<code>[宿主机IP]:[容器端口]</code>访问容器。</p>
<h3 id="网络模式"><a href="#网络模式" class="headerlink" title="网络模式"></a>网络模式</h3><p><img src="https://jameslin23.gitee.io/2020/12/22/docker%E5%9F%BA%E7%A1%80%E7%AF%87/image-20201223092909412.png" alt="image-20201223092909412"></p>
<h4 id="bridge模式-默认"><a href="#bridge模式-默认" class="headerlink" title="bridge模式(默认)"></a>bridge模式(默认)</h4><p>当Docker进程启动时，会在主机上创建一个名为docker0的虚拟网桥，此主机上启动的docker容器会连接到这个虚拟网桥上。从docker0子网络中分配一个IP给容器使用，并设置docker0的IP地址为容器的默认网关,在主机上创建一对虚拟网卡veth pair设备,docker将veth pair设备的一端放入新的创建的容器中，并命名eth0(容器的网卡)，另一端放在主机中。以vethxxx这样类似的名字命名,并将这个网络设备加入到doker0网桥中，可以通过brctl show命令查看</p>
<p>birdge模式是docker的默认网络模式，不写–net参数，就是bridge模式。使用docker run -p 时,docker实际就是做iptables做了DNAT规则，实现端口转发功能。可以使用iptables -t nat -vnl查看</p>
<p><img src="https://jameslin23.gitee.io/2020/12/22/docker%E5%9F%BA%E7%A1%80%E7%AF%87/image-20201223093913511.png" alt="image-20201223093913511"></p>
<h4 id="host模式"><a href="#host模式" class="headerlink" title="host模式"></a>host模式</h4><p>如果启动容器 的时候使用host模式，那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace 。容器将不会虚拟出自己的网卡，配置自己的ip等，而是使用宿主机ip和端口。但是容器的其他方面，如文件系统，进程列表等还是个宿主机隔离。</p>
<p>使用host模式的容器可以直接使用宿主机的ip地址与外界通信,容器内部的服务端口也可以使用宿主机的端口，不需要进行nat,host最大优势是网络性能比较好，但是docker host上已经使用的端口就不能再用了网络隔离性不好。</p>
<p><img src="https://jameslin23.gitee.io/2020/12/22/docker%E5%9F%BA%E7%A1%80%E7%AF%87/image-20201223094523624.png" alt="image-20201223094523624"></p>
<h4 id="container-模式"><a href="#container-模式" class="headerlink" title="container 模式"></a>container 模式</h4><p>这个模式指定新创建的容器和已经存在一个容器共享一个Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡，配自己IP。而是和一个指定的容器共享IP、端口等。同样2个容器除了网络方面，其他的如文件系统、进程列表等还是隔离的。2个容器进程可以通过lo网卡设备通信。</p>
<p><img src="https://jameslin23.gitee.io/2020/12/22/docker%E5%9F%BA%E7%A1%80%E7%AF%87/image-20201223095659128.png" alt="image-20201223095659128"></p>
<h4 id="none模式"><a href="#none模式" class="headerlink" title="none模式"></a>none模式</h4><p>使用none模式，docker容器拥有自己的Network Namespace,但是，并不为Docker容器进行任何网络配置，也就是说，这个容器没有网卡、IP、路由等信息。所以需要我们自己为docker容器添加网卡、配置IP等。</p>
<p>这种网络模式下容器只有lo回环网络，没有其他网卡。node模式可以在容器创建时通过–network=none来指定。这类型网络没有办法联网，封闭的网络能很好保证容器安全性。</p>
<p><img src="https://jameslin23.gitee.io/2020/12/22/docker%E5%9F%BA%E7%A1%80%E7%AF%87/image-20201223103642080.png" alt="image-20201223103642080"></p>

      
    </div>
    <footer class="article-footer">
      
        <div id="donation_div"></div>

<script src="/js/vdonate.js"></script>
<script>
var a = new Donate({
  title: '如果觉得我的文章对您有用，请随意打赏。您的支持将鼓励我继续创作!', // 可选参数，打赏标题
  btnText: '打赏支持', // 可选参数，打赏按钮文字
  el: document.getElementById('donation_div'),
  wechatImage: 'https://raw.githubusercontent.com/iTimeTraveler/iTimeTraveler.github.io/site/source/about/donate/images/WeChanQR.png',
  alipayImage: 'https://raw.githubusercontent.com/iTimeTraveler/iTimeTraveler.github.io/site/source/about/donate/images/AliPayQR.jpg'
});
</script>
      
      
      <div>
        <ul class="post-copyright">
          <li class="post-copyright-author">
          <strong>本文作者:  </strong>LeBron Tao
          </li>
          <li class="post-copyright-link">
          <strong>本文链接:  </strong>
          <a href="/2020/12/22/docker基础篇/" target="_blank" title="docker基础篇">https://jameslin23.gitee.io/2020/12/22/docker基础篇/</a>
          </li>
          <li class="post-copyright-license">
            <strong>版权声明:   </strong>
            本博客所有文章除特别声明外，均采用 <a rel="license" href="https://creativecommons.org/licenses/by-nc-nd/4.0/" target="_blank" title="Attribution-NonCommercial-NoDerivatives 4.0 International (CC BY-NC-ND 4.0)">CC BY-NC-ND 4.0</a>
            许可协议。转载请注明出处
          </li>
         
        </ul>
<div>
</div></div>
      
      
        
	<div id="comment">
		<!-- 来必力City版安装代码 -->
		<div id="lv-container" data-id="city" data-uid="MTAyMC8yOTQ4MS82MDQ5">
		<script type="text/javascript">
		   (function(d, s) {
		       var j, e = d.getElementsByTagName(s)[0];

		       if (typeof LivereTower === 'function') { return; }

		       j = d.createElement(s);
		       j.src = 'https://cdn-city.livere.com/js/embed.dist.js';
		       j.async = true;

		       e.parentNode.insertBefore(j, e);
		   })(document, 'script');
		</script>
		<noscript>为正常使用来必力评论功能请激活JavaScript</noscript>
		</div>
		<!-- City版安装代码已完成 -->
	</div>



      
      
        
  <ul class="article-tag-list"><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/运维与虚拟化技术/">运维与虚拟化技术</a></li></ul>

      

    </footer>
  </div>
  
    
<nav id="article-nav">
  
    <a href="/2020/12/24/OpenResty/" id="article-nav-newer" class="article-nav-link-wrap">
      <strong class="article-nav-caption">上一篇</strong>
      <div class="article-nav-title">
        
          OpenResty
        
      </div>
    </a>
  
  
    <a href="/2020/12/16/tcp可靠机制/" id="article-nav-older" class="article-nav-link-wrap">
      <strong class="article-nav-caption">下一篇</strong>
      <div class="article-nav-title">tcp可靠机制</div>
    </a>
  
</nav>

  
</article>

<!-- Table of Contents -->

  <aside id="toc-sidebar">
    <div id="toc" class="toc-article">
    <strong class="toc-title">文章目录</strong>
    
        <ol class="nav"><li class="nav-item nav-level-2"><a class="nav-link" href="#Docker简介"><span class="nav-number">1.</span> <span class="nav-text">Docker简介</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#什么是Docker？"><span class="nav-number">1.1.</span> <span class="nav-text">什么是Docker？</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#为什么用Docker"><span class="nav-number">1.2.</span> <span class="nav-text">为什么用Docker?</span></a></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#基本概念"><span class="nav-number">2.</span> <span class="nav-text">基本概念</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#Docker-镜像"><span class="nav-number">2.1.</span> <span class="nav-text">Docker 镜像</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#Docker-容器"><span class="nav-number">2.2.</span> <span class="nav-text">Docker 容器</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#Docker-仓库"><span class="nav-number">2.3.</span> <span class="nav-text">Docker 仓库</span></a></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#安装Docker"><span class="nav-number">3.</span> <span class="nav-text">安装Docker</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#使用镜像"><span class="nav-number">4.</span> <span class="nav-text">使用镜像</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#获取镜像"><span class="nav-number">4.1.</span> <span class="nav-text">获取镜像</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#列出容器"><span class="nav-number">4.2.</span> <span class="nav-text">列出容器</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#删除镜像"><span class="nav-number">4.3.</span> <span class="nav-text">删除镜像</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#Commit命令"><span class="nav-number">4.4.</span> <span class="nav-text">Commit命令</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#DockerFile定制镜像"><span class="nav-number">4.5.</span> <span class="nav-text">DockerFile定制镜像</span></a><ol class="nav-child"><li class="nav-item nav-level-4"><a class="nav-link" href="#定制centos镜像"><span class="nav-number">4.5.1.</span> <span class="nav-text">定制centos镜像</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#定制tomcat镜像"><span class="nav-number">4.5.2.</span> <span class="nav-text">定制tomcat镜像</span></a></li></ol></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#Docker-容器-1"><span class="nav-number">5.</span> <span class="nav-text">Docker 容器</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#启动容器"><span class="nav-number">5.1.</span> <span class="nav-text">启动容器</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#终止容器"><span class="nav-number">5.2.</span> <span class="nav-text">终止容器</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#进入容器"><span class="nav-number">5.3.</span> <span class="nav-text">进入容器</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#删除容器"><span class="nav-number">5.4.</span> <span class="nav-text">删除容器</span></a></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#Docker仓库"><span class="nav-number">6.</span> <span class="nav-text">Docker仓库</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#注册"><span class="nav-number">6.1.</span> <span class="nav-text">注册</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#登录"><span class="nav-number">6.2.</span> <span class="nav-text">登录</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#拉取镜像"><span class="nav-number">6.3.</span> <span class="nav-text">拉取镜像</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#推送镜像"><span class="nav-number">6.4.</span> <span class="nav-text">推送镜像</span></a></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#Docker数据管理"><span class="nav-number">7.</span> <span class="nav-text">Docker数据管理</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#使用命令"><span class="nav-number">7.1.</span> <span class="nav-text">使用命令</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#挂载方式"><span class="nav-number">7.2.</span> <span class="nav-text">挂载方式</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#扩展"><span class="nav-number">7.3.</span> <span class="nav-text">扩展</span></a></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#网络配置"><span class="nav-number">8.</span> <span class="nav-text">网络配置</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#实现原理"><span class="nav-number">8.1.</span> <span class="nav-text">实现原理</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#网络模式"><span class="nav-number">8.2.</span> <span class="nav-text">网络模式</span></a><ol class="nav-child"><li class="nav-item nav-level-4"><a class="nav-link" href="#bridge模式-默认"><span class="nav-number">8.2.1.</span> <span class="nav-text">bridge模式(默认)</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#host模式"><span class="nav-number">8.2.2.</span> <span class="nav-text">host模式</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#container-模式"><span class="nav-number">8.2.3.</span> <span class="nav-text">container 模式</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#none模式"><span class="nav-number">8.2.4.</span> <span class="nav-text">none模式</span></a></li></ol></li></ol></li></ol>
    
    </div>
  </aside>

</section>
        
      </div>
      
      <footer id="footer">
  

  <div class="container">
      	<div class="row">
	      <p> Powered by <a href="http://hexo.io/" target="_blank">Hexo</a> and <a href="https://github.com/iTimeTraveler/hexo-theme-hiker" target="_blank">Hexo-theme-hiker</a> </p>
	      <p id="copyRightEn">Copyright &copy; 2013 - 2021 JAVA All Rights Reserved.</p>
	      
	      
    		<p class="busuanzi_uv">
				访客数 : <span id="busuanzi_value_site_uv"></span> |  
				访问量 : <span id="busuanzi_value_site_pv"></span>
		    </p>
  		   
		</div>

		
  </div>
</footer>


<!-- min height -->

<script>
    var wrapdiv = document.getElementById("wrap");
    var contentdiv = document.getElementById("content");
    var allheader = document.getElementById("allheader");

    wrapdiv.style.minHeight = document.body.offsetHeight + "px";
    if (allheader != null) {
      contentdiv.style.minHeight = document.body.offsetHeight - allheader.offsetHeight - document.getElementById("footer").offsetHeight + "px";
    } else {
      contentdiv.style.minHeight = document.body.offsetHeight - document.getElementById("footer").offsetHeight + "px";
    }
</script>
    </div>
    <!-- <nav id="mobile-nav">
  
    <a href="/" class="mobile-nav-link">Home</a>
  
    <a href="/archives" class="mobile-nav-link">Archives</a>
  
    <a href="/categories" class="mobile-nav-link">Categories</a>
  
    <a href="/tags" class="mobile-nav-link">Tags</a>
  
    <a href="/about" class="mobile-nav-link">About</a>
  
</nav> -->
    

<!-- mathjax config similar to math.stackexchange -->

<script type="text/x-mathjax-config">
  MathJax.Hub.Config({
    tex2jax: {
      inlineMath: [ ['$','$'], ["\\(","\\)"] ],
      processEscapes: true
    }
  });
</script>

<script type="text/x-mathjax-config">
    MathJax.Hub.Config({
      tex2jax: {
        skipTags: ['script', 'noscript', 'style', 'textarea', 'pre', 'code']
      }
    });
</script>

<script type="text/x-mathjax-config">
    MathJax.Hub.Queue(function() {
        var all = MathJax.Hub.getAllJax(), i;
        for(i=0; i < all.length; i += 1) {
            all[i].SourceElement().parentNode.className += ' has-jax';
        }
    });
</script>

<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML">
</script>


  <link rel="stylesheet" href="/fancybox/jquery.fancybox.css">
  <script src="/fancybox/jquery.fancybox.pack.js"></script>


<script src="/js/scripts.js"></script>




  <script src="/js/dialog.js"></script>








	<div style="display: none;">
    <script src="https://s95.cnzz.com/z_stat.php?id=1260716016&web_id=1260716016" language="JavaScript"></script>
  </div>



	<script async src="//busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js">
	</script>






  </div>

  <div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true" style="display: none;">
  <div class="modal-dialog">
    <div class="modal-content">
      <div class="modal-header">
        <h2 class="modal-title" id="myModalLabel">设置</h2>
      </div>
      <hr style="margin-top:0px; margin-bottom:0px; width:80%; border-top: 3px solid #000;">
      <hr style="margin-top:2px; margin-bottom:0px; width:80%; border-top: 1px solid #000;">


      <div class="modal-body">
          <div style="margin:6px;">
            <a data-toggle="collapse" data-parent="#accordion" href="#collapseOne" onclick="javascript:setFontSize();" aria-expanded="true" aria-controls="collapseOne">
              正文字号大小
            </a>
          </div>
          <div id="collapseOne" class="panel-collapse collapse" role="tabpanel" aria-labelledby="headingOne">
          <div class="panel-body">
            您已调整页面字体大小
          </div>
        </div>
      


          <div style="margin:6px;">
            <a data-toggle="collapse" data-parent="#accordion" href="#collapseTwo" onclick="javascript:setBackground();" aria-expanded="true" aria-controls="collapseTwo">
              夜间护眼模式
            </a>
        </div>
          <div id="collapseTwo" class="panel-collapse collapse" role="tabpanel" aria-labelledby="headingTwo">
          <div class="panel-body">
            夜间模式已经开启，再次单击按钮即可关闭 
          </div>
        </div>

        <div>
            <a data-toggle="collapse" data-parent="#accordion" href="#collapseThree" aria-expanded="true" aria-controls="collapseThree">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;关 于&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</a>
        </div>
         <div id="collapseThree" class="panel-collapse collapse" role="tabpanel" aria-labelledby="headingThree">
          <div class="panel-body">
            JAVA
          </div>
          <div class="panel-body">
            Copyright © 2021 LeBron Tao All Rights Reserved.
          </div>
        </div>
      </div>


      <hr style="margin-top:0px; margin-bottom:0px; width:80%; border-top: 1px solid #000;">
      <hr style="margin-top:2px; margin-bottom:0px; width:80%; border-top: 3px solid #000;">
      <div class="modal-footer">
        <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
      </div>
    </div>
  </div>
</div>
  
  <a id="rocket" href="#top" class=""></a>
  <script type="text/javascript" src="/js/totop.js?v=1.0.0" async=""></script>
  
    <a id="menu-switch"><i class="fa fa-bars fa-lg"></i></a>
  
</body>
</html>